#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
合并codegen开头的zip包中的sql.sql文件内容到一个merginsql.sql文件
"""

import os
import zipfile
import glob
from pathlib import Path

def clean_sql_content(sql_content):
    """
    清理SQL内容，移除多余的空白行
    """
    lines = sql_content.split('\n')
    cleaned_lines = []

    for line in lines:
        # 移除行尾空白字符
        cleaned_line = line.rstrip()
        cleaned_lines.append(cleaned_line)

    # 移除连续的空白行，只保留单个空白行
    final_lines = []
    prev_empty = False

    for line in cleaned_lines:
        is_empty = len(line.strip()) == 0

        if is_empty:
            if not prev_empty:
                final_lines.append('')
            prev_empty = True
        else:
            final_lines.append(line)
            prev_empty = False

    # 移除开头和结尾的空白行
    while final_lines and final_lines[0] == '':
        final_lines.pop(0)
    while final_lines and final_lines[-1] == '':
        final_lines.pop()

    return '\n'.join(final_lines)

def merge_sql_files():
    """
    合并所有codegen开头的zip包中的sql.sql文件内容
    """
    # 获取当前脚本所在目录
    current_dir = Path(__file__).parent
    
    # 查找所有以codegen开头的zip文件
    codegen_zips = glob.glob(str(current_dir / "codegen-*.zip"))
    
    if not codegen_zips:
        print("未找到以codegen开头的zip文件")
        return
    
    print(f"找到 {len(codegen_zips)} 个codegen开头的zip文件")
    
    # 输出文件路径
    output_file = current_dir / "merginsql.sql"
    
    # 用于存储所有SQL内容的列表
    all_sql_content = []
    
    # 添加文件头注释
    all_sql_content.append("-- =============================================")
    all_sql_content.append("-- 合并后的SQL文件")
    all_sql_content.append(f"-- 生成时间: {Path().cwd()}")
    all_sql_content.append(f"-- 包含的zip文件数量: {len(codegen_zips)}")
    all_sql_content.append("-- =============================================")
    
    # 遍历每个zip文件
    for zip_path in sorted(codegen_zips):
        zip_name = Path(zip_path).name
        print(f"正在处理: {zip_name}")
        
        try:
            with zipfile.ZipFile(zip_path, 'r') as zip_file:
                # 查找zip文件中的sql.sql文件
                sql_files = [f for f in zip_file.namelist() if f.endswith('sql/sql.sql')]
                
                if sql_files:
                    # 读取sql.sql文件内容
                    sql_content = zip_file.read(sql_files[0]).decode('utf-8')
                    
                    # 添加分隔符和文件信息
                    all_sql_content.append(f"-- =============================================")
                    all_sql_content.append(f"-- 来自: {zip_name}")
                    all_sql_content.append(f"-- 文件路径: {sql_files[0]}")
                    all_sql_content.append("-- =============================================")
                    
                    # 清理SQL内容：移除多余的空白行
                    cleaned_sql_content = clean_sql_content(sql_content)
                    all_sql_content.append(cleaned_sql_content)
                    
                    print(f"  ✓ 成功提取 {zip_name} 中的sql.sql")
                else:
                    print(f"  ✗ {zip_name} 中未找到sql.sql文件")
                    
        except Exception as e:
            print(f"  ✗ 处理 {zip_name} 时出错: {e}")
    
    # 写入合并后的文件
    try:
        with open(output_file, 'w', encoding='utf-8') as f:
            for i, content in enumerate(all_sql_content):
                f.write(content)
                # 只在非最后一个元素后添加换行符
                if i < len(all_sql_content) - 1:
                    f.write('\n')
        
        print(f"\n✓ 成功创建合并文件: {output_file}")
        print(f"✓ 总共处理了 {len(codegen_zips)} 个zip文件")
        
    except Exception as e:
        print(f"✗ 写入合并文件时出错: {e}")

if __name__ == "__main__":
    merge_sql_files()
